Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

849
Vistas
Usando PostgreSQL, ¿cómo escapo "\" en las columnas json?

Estoy usando Postgres 9.5 y tengo una columna ("info") de tipo 'json'... Estoy tratando de hacer esta inserción:

 INSERT INTO table ( info ) VALUES ( '{"entry":"((\+)[0-9]+)"}' )

pero me sale este error:

 ERROR: invalid input syntax for type json DETAIL: Escape sequence "\+" is invalid.

Está interpretando \+ como una secuencia de escape, pero en realidad quiero eso como parte de mi valor.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

En general,

  • si tiene claves y valores, use jsonb_build_object para construir el objeto
  • si está escribiendo un objeto JSON literal para convertirlo desde una cadena, entonces debe ser correcto; una cadena JSON adecuada requiere escapar \ .

Explicación

PostgreSQL no cita esto: es solo la implementación de JSON después de RFC 7159 .

Una cadena comienza y termina con comillas. Todos los caracteres Unicode se pueden colocar entre comillas, excepto los caracteres que se deben escapar: comillas, sólido inverso y los caracteres de control (U+0000 a U+001F). [... ] Entonces, por ejemplo, una cadena que contiene solo un único carácter solidus inverso puede representarse de manera más compacta como "\\" .

Entonces se ve así en la forma literal.

 CREATE TABLE tbl AS SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;

La cotización de dólares en PostgreSQL no requiere escapes, pero no ayudará aquí,

Tenga en cuenta que dentro de la cadena cotizada en dólares, se pueden usar comillas simples sin necesidad de escapar. De hecho, ningún carácter dentro de una cadena cotizada en dólares nunca se escapa : el contenido de la cadena siempre se escribe literalmente. Las barras invertidas no son especiales, ni tampoco los signos de dólar, a menos que formen parte de una secuencia que coincida con la etiqueta de apertura.

Entonces esto no funcionará porque \+ no es una cadena válida en JSON. Sin embargo, funcionaría si no estuviéramos usando un tipo json.

 SELECT '{"key":"\"}'::jsonb; ERROR: invalid input syntax for type json LINE 1: SELECT '{"key":"\"}'::jsonb; ^ DETAIL: Token ""\"}" is invalid. CONTEXT: JSON data, line 1: {"key":"\"}

Sin embargo, puede usar to_jsonb() para escapar de JSON de las cadenas.

 SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb FROM ( VALUES ('key', '\' ) ) AS t(k,v);

Pero incluso esto es una mala idea porque si tiene las claves y los valores, puede usar json_build_object ,

 SELECT jsonb_build_object( k, v ) FROM ( VALUES ('key', '\' ) ) AS t(k,v);
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda